Практическое применение многопроцессорных систем

  С появлением доступных многопроцессорных систем возник у пользователей: как использовать мощность компьютерной техники. При использовании обыкновенного программного обеспечения количество процессоров системы в основном простаивает.
  Практическим примером может служить, например преобразование музыкальных файлов flacogg. Можно, например использовать консольный запрос:

for i in *.flac ; do oggenc --quality=10 "$i" ; done

  Но при большом количестве файлов простаивающие процессоры слегка вызывают раздражение. Для того, чтобы оценить мощность производительной техники нужно параллельное программное обеспечение.
  Предлагается использовать хорошую программу на языке Lisp2D, которая запускает параллельно конвертацию файлов, заключённых в директориях. Количество одновременно запущенных задач будет всегда равно количеству процессоров.


(('freemans defclass) defvar
  n signal  lock  nwaitsignal)
('freemans  defmethod freemans  ()
  (nil  setq
    n (nil  nprocs)
    signal  ('signal  newobject)
    lock  ('lock  newobject)
    nwaitsignal (0  copy)))
('freemans  defmethod enter ()
  (lock progn
    (nil  when  (n  = 0)
      (nwaitsignal  +=  1)
      (signal wait  lock))
    (n  -=  1)))
('freemans  defmethod exit  ()
  (lock progn
    (n  +=  1)
    (nil  when  (nwaitsignal  >  0)
      (nwaitsignal  -=  1)
      (signal send))))
('string  defmethod flactoogg (q  freemans)
  (nil  let (s  (d  ('dir newobject this)))
    (nil  while ('s set (d  read))
      (nil  let ((fullname  (this + "/" s)) stat  type)
        ('stat  set (fullname stat))
        ('type  set (stat file-type))
        (nil  cond
          ((s = "."))
          ((s = ".."))
          ((type  = 'regular)
            (nil  let ((ss  (s  size)))
              (nil  if  (ss > 5)
                (nil  when  (((s  part  (ss - 5)) lower)  = ".flac")
                  (freemans enter)
                  (nil  fork
                    (nil  if  (0  = ("oggenc"  system  ("--quality="  + q)  fullname))
                      (fullname unlink)
                      (cerr writeln "crash oggenc for " fullname))
                    (freemans exit))))))
          ((type  = 'directory)
            (fullname flactoogg q freemans)))))
    (d  close)))
("."  flactoogg (arg first) ('freemans  newobject))

  Результатом использования параллельно запущенных процессов станет полноценная загрузка процессоров полезной работой. И огромная экономия личного времени.