Графический интерфейс (X11)
Рабочий стол
С появлением универсальных высокоуровневых инструментов стала приближаться к осуществлению идея полного воплощения метафоры "рабочего стола", впервые реализованная в системах семейства MacOS. Смысл рабочего стола в том, чтобы предложить принципиально иной способ взаимодействия человека и компьютера – способ, основанный на манипуляции единичными именованными объектами. Каталоги превращаются в "папки с документами", причем каждый тип документов можно "открыть" с помощью специального "документатора". Программы превращаются в эдакие вместилища абстрактных функциональностей: "Internet", "Почта", "Видео" и т. п. Рабочий стол особенно необходим человеку, чья область деятельности далека от компьютерного дела, для кого он – не вычислительная машина, а инструмент решения отдельных – типовых и, чаще всего, непрофильных – задач.
Компьютер так уверенно вошел в каждый дом, что давно уже стал бытовым прибором для игр, чтения электронной почты, просмотра WWW, а в последнее время – еще и музыкальным центром и видеопроигрывателем. Грешно требовать от садящейся за клавиатуру домохозяйки или какого-нибудь оболтуса строгого следования принципам проективной системы. Лучше дать им в руки красивую и сравнительно безопасную игрушку, которая способна удовлетворять их бытовые нужды. Таких игрушек для X11 несколько. Две мощные среды "офисного" плана – KDE (основанное на Qt переосмысление коммерческой среды CDE) и Gnome (основанная на GTK) – содержат все необходимое для работы (включая собственные офисные приложения и средства просмотра WWW). Или, например, среда XFCE (основанная также на GTK) – крепко сколоченный минималистский вариант CDE, простой и ясный, как выдвижной ящик.
Мефодий выбрал одну из таких игрушек – KDE, начав с оформления рабочего стола на свой вкус. Когда ему, наконец, наскучило перекрашивать меню и загромождать рабочий стол безделушками, он попробовал заняться делом. В примере отображен снимок экрана в один из моментов его работы, когда он попытался воспользоваться для работы с файлами специально разработанной для KDE программой ( konqueror, которая служит заодно и броузером) вместо уже привычной ему командной строки. При этом Мефодия насторожило время, которое ему потребовалось на выполнение вполне привычных простейших операций над несколькими файлами и каталогами: для каждого пришлось делать отдельное движение мышью, да и в целом все стало происходить гораздо медленнее, чем обычно, а компьютер то и дело принимался хрустеть жестким диском (рис. 16.9).
До сей поры Мефодий считал, что его – не такой уж новый – компьютер вполне подходит для работы в Linux, и ничто этому утверждению не противоречило. Желая проверить, чем же занимается система, он запустил команду top, нажал "M", для того чтобы посмотреть, какие процессы занимают больше всего памяти, и обнаружил довольно неприятную, хотя и вполне терпимую картину:
00:55:08 up 13:20, 13 users, load average: 1,71, 1,87, 0,97 29 processes: 28 sleeping, 1 running, 0 zombie, 0 stopped CPU states: 60,6% user, 14,6% system, 6,2% nice, 0,0% iowait, 18,4% idle Mem: 54232k av, 53076k used, 1156k free, 0k shrd, 1628k buff 18032k active, 22620k inactive Swap: 200772k av, 108288k used, 92484k free 15812k cached PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 15410 methody 13 5 9448 8980 8096 S N 0,0 16,5 0:01 kdeinit 15379 methody 9 0 9656 7928 7184 S 0,1 14,6 0:06 kdeinit 15404 methody 9 0 9652 7612 7428 S 0,0 14,0 0:02 kdeinit 15395 methody 9 0 9596 7376 7372 S 0,0 13,6 0:02 kdeinit 15406 methody 9 0 10084 7216 6192 S 0,0 13,3 0:09 konqueror 15397 methody 9 0 8592 7140 6560 S 0,5 13,1 0:03 korgac 15387 methody 9 0 8464 6920 6748 S 0,0 12,7 0:02 kdeinit 15390 methody 9 0 8488 6644 6640 S 0,0 12,2 0:01 kdeinit 15393 methody 9 0 8576 6636 6632 S 0,0 12,2 0:02 kkbswitch 15407 methody 9 0 6864 6164 6064 S 0,0 11,3 0:00 kdeinit 15377 methody 9 0 7592 5844 5440 S 0,0 10,7 0:04 kdeinit 15380 methody 9 0 6564 5736 5624 S 0,0 10,5 0:00 kdeinit 15346 methody 9 0 6652 5028 4744 S 0,1 9,2 0:02 kdeinit 15368 methody 9 0 6864 4972 4972 S 0,0 9,1 0:02 kdeinit 15376 methody 9 0 6164 4504 4504 S 0,0 8,3 0:01 kdeinit 15356 methody 9 0 6608 4436 4432 S 0,0 8,1 0:01 kdeinit 15366 methody 9 0 6008 4436 4436 S 0,0 8,1 0:01 kdeinit 15343 methody 9 0 5248 4388 4156 S 0,1 8,0 0:00 kdeinit 15385 methody 9 0 5412 3984 3876 S 0,0 7,3 0:01 apt-indicator 15341 methody 9 0 4540 3768 3612 S 0,0 6,9 0:00 kdeinit 15338 methody 8 0 2260 1444 1368 S 0,0 2,6 0:00 kdeinit 15411 methody 15 0 1092 1040 844 R 2,3 1,9 0:01 top 15200 methody 9 0 628 520 520 S 0,0 0,9 0:00 xinit 15159 methody 9 0 912 508 508 S 0,0 0,9 0:00 bash 15209 methody 9 0 640 476 472 S 0,0 0,8 0:01 startkde 15185 methody 9 0 564 408 408 S 0,0 0,7 0:00 startx 15364 methody 9 0 304 276 256 S 0,0 0,5 0:00 kwrapperПример 16.6. Загрузка компьютера во время работы KDE
Первое, что бросилось ему в глаза – множество процессов, запущенных явно средой KDE (кому же еще может принадлежать программа kdeinit?). Мефодий подсчитал число процессов, начинающихся на "kde" ( ps ax | grep kde | grep -v grep | wc -l ) – их оказалось 17 штук. Каждый из этих процессов затребовал у системы по три-четыре мегабайта памяти (поле SIZE ), из которых полтора-два (поле RSS ) немедленно использовал. Не так уж и много – если бы такая программа запускалась одна. Но две дюжины kdeinit вполне способны израсходовать всю оперативную память компьютера, если объем его физической памяти составляет, как на компьютере Мефодия, 64 мегабайта (из них порядка девяти мегабайтов заняло ядро – эта память не отображается в поле mem – и сколько-то уходит на сам X-сервер и прочие программы, не принадлежащие Мефодию).
Впрочем, даже в таком состоянии Linux продолжает работать довольно-таки бодро. Дело в том, что большинство из этих процессов (все, кроме самого top, об этом говорит строка "1 running" ) в данный момент неактивны ( sleeping ). Большинство полученных ими ресурсов система давно уже отправила в область подкачки ( swap ) на диске. Затруднения начнутся, если несколько неактивных программ "проснутся": система начнет поднимать из swap их ресурсы, а чтобы для них хватило места в оперативной памяти – откачивать туда память других программ (отсюда и неожиданная дисковая активность, на которую Мефодий обратил внимание). Хуже всего, если для работы всех активных процессов одновременно не хватает места – тогда процесс откачки-закачки будет отнимать большую часть процессорного времени, и для полезных задач его просто не останется. Определить такую ситуацию (она называется "дребезг", trashing ) можно по высоким значениям полей system , а еще по постоянно ненулевым значениям в полях si и so команды vmstat:
procs memory swap io system cpu r b w swpd free buff cache si so bi bo in cs us sy id 0 1 0 106092 1352 1168 19380 14 10 265 33 127 407 14 4 82
Этот опыт произвел на Мефодия отрицательное впечатление, и он решил организовать себе графическое рабочее место на основании какого-нибудь менее громоздкого инструмента. Впрочем, провести границу, где заканчиваются обязанности диспетчера окон и начинаются ухищрения рабочего стола, очень трудно. Видимо, разумно считать, что диспетчер окон делается средой рабочего стола, когда появляются пользовательские приложения с использованием его особых свойств и его библиотек. Если главная задача рабочего места – запускать xterm, то достаточно даже очень старого диспетчера окон twm (он всегда есть в составе XFree86, но редко используется по причине некрасивого, "плоского" оформления интерфейса). Вместо него можно использовать диспетчеры, подобные icewm или fluxbox, обладающие более широкими возможностями и при этом нетребовательные к ресурсам. Если необходимо просто и незамысловато обеспечить доступ к основным пользовательским X-приложениям, подойдет XFCE. Наконец, диспетчеры, подобные WindowMaker или fwvm, предоставляют множество возможностей и гибко настраиваются, не "вытягивая" за собой ресурсоемких программных структур, используемых в KDE или Gnome.
Поразмыслив, Мефодий решил остановиться на WindowMaker: система меню показалась ему приятной для глаз, а способ быстрого запуска – удобным. Кроме того, его позабавили "активные иконки", шевелящиеся в момент запуска соответствующего приложения.