太苦逼了。从昨天晚上到今天下午才写好这么一个功能。
OS的学问真实博大精深,只是一个ID的存储过程就复杂到看的我想哭了。这还只是其中最简单的一部分。
好在,虽然还是有一些小问题,不过基本还是都解决了,终于可以稍微放送以下了,一会进行下一个作业。
已经是满面油光了阿。。。~
其中遇到了一个小问题,由于原来参考别人写代码中将page初始化为char []的格式,又将其中的每个字符初始值设为‘0’
这么做看似不错,但是在测试的时候,线程号4和5永远无法分配出去,这是因为‘0’的二进制值为48,所以导致轮到4和5的时候,其中一步判断无法继续下去。
将其该为unsign long [ ] ,并将初始值设置为数字 0 该问题得到解决。
1.首先在threads文件夹中添加已经写好的tid.h和tid.cc
//tid.h
//created by yumeng 2012-3-3
#ifndef TID_H
#define TID_H
/* max tid, equal to 2^15=32768
最大线程id号,为了兼容16位机器*/
#define TID_MAX_DEFAULT 0x8000
/* page size = 2^12 = 4K
PAGE_SHIFT :偏移量
将1UL向左偏移12位,即为结果 */
#define PAGE_SHIFT 12
#define PAGE_SIZE (1UL << PAGE_SHIFT)
/*
每页的位数为2^15,每一位对应一个线程号
*/
#define BITS_PER_BYTE 8
#define BITS_PER_PAGE (PAGE_SIZE * BITS_PER_BYTE)
#define BITS_PER_PAGE_MASK (BITS_PER_PAGE - 1)
typedef struct tidmap
{
unsigned int nr_free;
unsigned long page[PAGE_