ΪÄÚºËѰÕÒнø³ÌÔÚcpuÉÏÔËÐÐʱ£¬±ØÐëÖ»¿¼ÂÇ¿ÉÔËÐнø³Ì£¨TASK_RUNNING£©¡£
Ìá¸ßµ÷¶È³ÌÐòÔËÐÐËٶȵľ÷ÇÏÊǽ¨Á¢¶à¸ö¿ÉÔËÐнø³ÌÁ´±í£¬Ã¿ÖÖ½ø³ÌÓÅÏÈȨ¶ÔÓ¦Ò»¸ö²»Í¬µÄÁ´±í¡£Ã¿¸ötask_structÃèÊö·û°üº¬Ò»¸ölist_headÀàÐ͵Ä×Ö¶Îrun_list¡£Èç¹û½ø³ÌµÄÓÅÏÈȨµÈÓÚk(0-139)£¬run_list×ֶΰѸýø³ÌÁ´ÈëÓÅÏÈȨΪkµÄ¿ÉÔËÐнø³ÌµÄÁ´±íÖС£
Äں˱ØÐëΪϵͳÖÐÿ¸öÔËÐжÓÁб£´æ´óÁ¿µÄÊý¾Ý£¬²»¹ýÔËÐжÓÁеÄÖ÷Òª½á¹¹»¹ÊÇ×é³ÉÔËÐжÓÁеĽø³ÌÃèÊö·û±í£¬ËùÓÐÕâЩÁ´±í¶¼ÓÉÒ»¸öµ¥¶ÀµÄprio_array_tÊý¾Ý½á¹¹À´ÊµÏÖ¡£
185 struct prio_array {
186 unsigned int nr_active; Á´±íÖнø³ÌÃèÊö·ûµÄÊýÁ¿
187 unsigned long bitmap[BITMAP_SIZE]; ÓÅÏÈȨλͼ£ºµ±ÇÒ½öµ±Ä³¸öÓÅÏÈȨµÄ½ø³ÌÁ´±í²»Îª¿ÕʱÉèÖÃÏàÓ¦µÄλ±êÖ¾
188 struct list_head queue[MAX_PRIO]; 140¸öÓÅÏÈȨ¶ÓÁеÄÍ·½áµã
189 };
static void enqueue_task(struct task_struct *p, prio_arra ......
É¢ÁУ¨hash£©º¯Êý²¢²»×ÜÄÜÈ·±£pidÓë±íË÷ÒýÒ»Ò»¶ÔÓ¦¡£Á½¸ö²»Í¬µÄpidÉ¢Áе½ÏàͬµÄ±íË÷Òý³ÆÎª³åÍ»£¨colliding£©,linuxÀûÓÃÁ´±íÀ´´¦Àí³åÍ»µÄpid,ÿһ¸ö±íÏîÊÇÓɳåÍ»µÄ½ø³ÌÃèÊö·û×é³ÉµÄË«ÏòÁ´±í¡£
pidÉ¢ÁбíµÄÊý¾Ý½á¹¹½â¾öÁËËùÓÐÕâЩÄÑÌ⣬ËûÃÇ¿ÉÒÔΪ°üº¬ÔÚÒ»¸öÉ¢ÁбíÖеÄÈκÎpidºÅ¶¨Òå½ø³ÌÁ´±í¡£×îÖ÷ÒªµÄÊý¾Ý½á¹¹ÊÇËĸöpid½á¹¹µÄÊý×飬ËüÔÚ½ø³ÌÃèÊö·ûµÄpid×Ö¶ÎÖС£
struct pid
{
/* Try to keep pid_chain in the same cacheline as nr for find_pid */
int nr;pidµÄÊýÖµ
struct hlist_node pid_chain;/* list of pids with the same nr, only one of them is in the hash */Á´½ÓÉ¢ÁÐÁ´±íµÄÏÂÒ»¸öºÍǰһ¸öÔªËØ
struct list_head pid_list;ÿ¸öpidµÄ½ø³ÌÁ´±íÍ·
};
»ù±¾ÔË×÷£ºpid_hashÖеÄËĸö»ù±¾ÀàÐͱíÍ·ÕÒµ½tgid¹þÏ£±í£¬È»ºóÕÒµ½¶ÔÓ¦±íÏîÔÙ½øÒ»²½ÕÒµ½½ø³ÌÃèÊö·ûÖеÄpid_chain×ֶΣ¬È»ºó½øÒ»²½ÕÒµ½process descriptorÖеÄpid_chain±íÏȻºóÕÒµ½¹þÏ£±í¡£
´¦ÀípidÉ¢ÁбíµÄº¯ÊýºÍºê£º ......
µÈ´ý¶ÓÁÐÔÚÄÚºËÖкܶàÓÃ;£¬ÓÈÆäÓÃÔÚÖжϴ¦Àí¡¢½ø³Ìͬ²½¼°¶¨Ê±¡£µÈ´ý¶ÓÁÐʵÏÖÁËÔÚʼþÉϵÄÌõ¼þµÈ´ý£ºÏ£ÍûµÈ´ýÌØ¶¨Ê¼þµÄ½ø³Ì°Ñ×Ô¼º·Å½øºÏÊʵĵȴý¶ÓÁУ¬²¢·ÅÆú¿ØÖÆÈ¨¡£Òò´Ë£¬µÈ´ý¶ÓÁбíʾһ×é˯ÃߵĽø³Ì£¬µ±Ä³Ò»Ìõ¼þ±äÎªÕæÊ±£¬ÓÉÄں˻½ÐÑËüÃÇ¡£
µÈ´ý¶ÓÁÐÓÉË«ÏòÁ´±íʵÏÖ£¬ÆäÔªËØ°üÀ¨Ö¸Ïò½ø³ÌÃèÊö·ûµÄÖ¸Õ롣ÿ¸ö¶ÓÁж¼ÓÐÒ»¸öµÈ´ý¶ÓÁÐÍ·£¬µÈ´ý¶ÓÁÐÍ·ÊÇÒ»¸öÀàÐÍΪwait_queue_head_tµÄÊý¾Ý½á¹¹¡£
struct __wait_queue_head {
spinlock_t lock;
struct list_head task_list;
};
typedef struct __wait_queue_head wait_queue_head_t;
µÈ´ý¶ÓÁÐÓÉÖжϴ¦Àí³ÌÐòºÍÖ÷ÒªÄں˺¯ÊýÐ޸ġ£Í¬²½ÊÇͨ¹ýµÈ´ý¶ÓÁÐÍ·ÖеÄlock×ÔÐýËø´ïµ½µÄ£¬task_list×Ö¶ÎÊǵȴý½ø³ÌÁ´±íµÄÍ·¡£
µÈ´ý¶ÓÁÐÁ´±íÖеÄÔªËØÀàÐÍΪwait_queue_t:
struct __wait_queue {
unsigned int flags;
#define WQ_FLAG_EXCLUSIVE 0x01
struct task_struct * task;
& ......
ÿ¸ö½ø³Ì¶¼ÓÐÒ»×éÏà¹ØµÄ×ÊÔ´ÏÞÖÆ£¨resource limit£©£¬ÏÞÖÆÁËÖ¸¶¨½ø³ÌÄÜʹÓõÄϵͳ×ÊÔ´ÊýÁ¿¡£
¶Ôµ±Ç°½ø³ÌµÄ×ÊÔ´ÏÞÖÆ´æ·ÅÔÚcurrent->signal->rlim×ֶΣ¬½ø³ÌµÄÐźÅÃèÊö·ûµÄÒ»¸ö×ֶΡ£¸Ã×Ö¶ÎÀàÐÍΪrlimit½á¹¹µÄÊý×飬ÿ¸ö×ÊÔ´ÏÞÖÆ¶ÔÓ¦Ò»¸öÔªËØ¡£
struct rlimit {
unsigned long rlim_cur;
unsigned long rlim_max;
};
ÆäÖÐrlim_cur×Ö¶ÎÊÇ×ÊÔ´µÄµ±Ç°×ÊÔ´ÏÞÖÆ£¨current->signal->rlim[RLIMIT_CPU]£©¡£rlim_cur±íʾÕýÔËÐнø³ÌËùÕ¼ÓÃcpuʱ¼äµÄµ±Ç°ÏÞÖÆ
rlim_max×Ö¶ÎÊÇ×ÊÔ´ÏÞÖÆËùÔÊÐíµÄ×î´óÖµ¡£ÀûÓÃgetrlimit()ºÍsetrlimit()ϵͳµ÷Óã¬Óû§×ÜÄܰÑһЩ×ÊÔ´µÄrlim_curÏÞÖÆÔö¼Óµ½rlim_max¡£Ö»Óг¬¼¶Óû§£¨¾ßÓÐCAP_SYS_RESOURCEȨÄܵÄÓû§£©²ÅÄܸıärlim_max×ֶΣ¬»ò°Ñrlim_cur×Ö¶ÎÉèÖóɴóÓÚÏàÓ¦rlim_max×ֶεÄÒ»¸öÖµ¡£
´ó¶àÊý×ÊÔ´ÏÞÖÆ°üº¬ÊýÖµRLIM_INFINITY(0xffffffff),ËüÒâζ×ÅûÓжÔÏàÓ¦µÄ×ÊÔ´Ê©¼ÓÓû§ÏÞÖÆ¡£
#ifndef __ARCH_RLIMIT_ORDER
#define RLIMIT_CPU   ......
/* Ëûͨ¹ýÖ»¸´ÖÆÄÚ´æÒ³ÃæÀ´¸´ÖÆÒ»¶¨·¶Î§ÄÚµÄÏßÐÔµØÖ·µÄÄÚÈÝ*/
00150int copy_page_tables(unsigned long from,unsigned long to,long size)
00151 {
00152 unsigned long * from_page_table;
00153 unsigned long * to_page_table;
00154 unsigned long this_page;
00155 unsigned long * from_dir, * to_dir;
00156 unsigned long nr;
00157 //ÏÂÃæÊÇÅжÏfrom ºÍto ÊÇ·ñÔÚ£´£ÍµÄ±ß½ç´¦
00158 if ((from&0x3fffff) || (to&0x3fffff))
00159 panic("copy_page_tables called with wrong alignment");
¡¡¡¡¡¡¡¡//¸³給from_dir ҳĿ¼±íµÄԴĿ¼ÆðʼºÅ (from>>20)&oxfffc £½(from>>22)<<2
00160 from_dir = (unsigned long *) ((from>>20) & 0xffc); /* _pg_dir = 0 */
//¸³給to_d ......
ÔÚ LinuxϵͳÀïÃæ£¬“·ÖÇø”£¬±»³Æ×÷“¹ÒÔØµã”£¬¼òµ¥Ã÷Á˵Ä˵£¬“¹ÒÔØµã”Òâ˼¾ÍÊÇ£º°ÑÒ»²¿·ÖÓ²ÅÌÈÝÁ¿£¬“·Ö”³ÉÒ»¸öÎļþ¼ÐµÄÐÎʽ£¬ÓÃÀ´¸ÉʲôÊÂÇé¡£Õâ¸öÎļþ¼ÐµÄÃû×Ö£¬¾Í½Ð×ö£º“¹ÒÔØµã”¡£ËùÒÔ£¬ºÍWindowsÓÐ×ű¾ÖÊÉϵij¬¼¶´óµÄÇø±ð£¬ÄãÔÚÈκÎlinux·¢ÐаæÏµÍ³ÀïÃæ£¬¾ø¶Ô²»»á¿´µ½CÅÌ£¬DÅÌ£¬E ÅÌÕâÑùµÄ£¬ÄãÄÜ¿´µ½µÄ£¬Ö»ÓГÎļþ¼Ð”ÐÎʽ´æÔڵē¹ÒÔØµã”¡£
ÔÚLinux ϵͳÀïÃæ£¬ÓÐһЩÒѾ¶¨ÒåºÃ£¬ÓÃÀ´¸ÉһЩÊÂÇéµÄ¹ÒÔØµã£¬³£¼ûµÄ“¹ÒÔØµã”ÓУº
/bin ¸ÃĿ¼Öдæ·ÅLinuxµÄ³£ÓÃÃüÁî¡£
/boot ¸ÃĿ¼ĬÈÏÏ´æ·ÅµÄÊÇLinuxµÄÆô¶¯ÎļþºÍÄںˡ£
/cdrom ¸ÃĿ¼ÔÚ¸Õ°²×°ÏµÍ³Ê±Êǿյģ¬Äã¿ÉÒÔ½«¹âÇýÎļþϵͳ¹ÒÔÚÕâ¸öĿ¼Ï¡£
/dev ¸ÃĿ¼°üº¬ÁËLinuxϵͳÖÐʹÓõÄËùÓÐÍⲿÉ豸£¬Ëüʵ¼ÊÉÏÊÇ·ÃÎÊÕâЩÍⲿÉ豸µÄ¶Ë¿Ú£¬Äã¿ÉÒÔ·ÃÎÊÕâЩÍⲿÉ豸£¬Óë·ÃÎÊÒ»¸öÎļþ»òÒ»¸öĿ¼ûÓÐÇø±ð¡£ÀýÈçÔÚϵͳÖмüÈë“cd /dev/cdrom”£¬¾Í¿ÉÒÔ¿´µ½¹âÇýÖеÄÎļþ£»¼üÈë“cd /dev/mouse”¼´¿É¿´Êó±êµÄÏà¹ØÎļþ¡£
/etc ¸ÃĿ¼´æ·Åϵͳ¹ÜÀíʱҪÓõ½µÄ¸÷ÖÖÅäÖÃÎ ......