We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Linux系统有提供许多方便的API,就像Andoird中TextView的setText方法一样,我们只需要简单调用就可以实现一些功能,为了方便大家阅读Linux源码,我将一些常用的API列举出来
我先大致分个类吧
出现在《Android系统启动流程之Linux内核》
kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
这个函数作用是启动进程
sched_setscheduler_nocheck(kthreadd_task, SCHED_FIFO, ¶m);
这个函数作用是设置进程调度策略
进程调度策略如下:
SCHED_FIFO和SCHED_RR和SCHED_DEADLINE则采用不同的调度策略调度实时进程,优先级最高
SCHED_NORMAL和SCHED_BATCH调度普通的非实时进程,优先级普通
SCHED_IDLE则在系统空闲时调用idle进程,优先级最低
参考Linux进程调度器的设计
rcu_read_lock(); kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns); rcu_read_unlock();
RCU(Read-Copy Update)是数据同步的一种方式,在当前的Linux内核中发挥着重要的作用。RCU主要针对的数据对象是链表,目的是提高遍历读取数据的效率,为了达到目的使用RCU机制读取数据的时候不对链表进行耗时的加锁操作。这样在同一时间可以有多个线程同时读取该链表,并且允许一个线程对链表进行修改(修改的时候,需要加锁)
参考Linux 2.6内核中新的锁机制--RCU
设定NUMA系统的默认内存访问策略
将一个文件或者其它对象映射进内存
map = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
start:映射区的开始地址,设置为0时表示由系统决定映射区的起始地址。
length:映射区的长度。长度单位是 以字节为单位,不足一内存页按一内存页处理
prot:期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运算合理地组合在一起
flags:指定映射对象的类型,映射选项和映射页是否可以共享。它的值可以是一个或者多个以下位的组合体
fd:有效的文件描述词。一般是由open()函数返回,其值也可以设置为-1,此时需要指定flags参数中的MAP_ANON,表明进行的是匿名映射
off_toffset:被映射对象内容的起点。
创建一对socket,用于本机内的进程通信 参数分别是:
struct sigaction 类型用来描述对信号的处理,定义如下: struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags; void (*sa_restorer)(void); };
sa_handler 是一个函数指针,其含义与 signal 函数中的信号处理函数类似 sa_sigaction 则是另一个信号处理函数,它有三个参数,可以获得关于信号的更详细的信息。当 sa_flags 成员的值包含了 SA_SIGINFO 标志时,系统将使用 sa_sigaction 函数作为信号处理函数,否则使用 sa_handler 作为信号处理函数。在某些系统中,成员 sa_handler 与 sa_sigaction 被放在联合体中,因此使用时不要同时设置。 sa_mask 成员用来指定在信号处理函数执行期间需要被屏蔽的信号,特别是当某个信号被处理时,它自身会被自动放入进程的信号掩码,因此在信号处理函数执行期间这个信号不会再度发生。 sa_flags 成员用于指定信号处理的行为,它可以是一下值的“按位或”组合。
The text was updated successfully, but these errors were encountered:
nice
Sorry, something went wrong.
No branches or pull requests
Linux系统有提供许多方便的API,就像Andoird中TextView的setText方法一样,我们只需要简单调用就可以实现一些功能,为了方便大家阅读Linux源码,我将一些常用的API列举出来
我先大致分个类吧
一、进程与进程调度
1.1 kernel_thread
出现在《Android系统启动流程之Linux内核》
这个函数作用是启动进程
1.2 sched_setscheduler_nocheck
出现在《Android系统启动流程之Linux内核》
这个函数作用是设置进程调度策略
进程调度策略如下:
SCHED_FIFO和SCHED_RR和SCHED_DEADLINE则采用不同的调度策略调度实时进程,优先级最高
SCHED_NORMAL和SCHED_BATCH调度普通的非实时进程,优先级普通
SCHED_IDLE则在系统空闲时调用idle进程,优先级最低
参考Linux进程调度器的设计
二、同步与锁
2.1 rcu_read_lock、rcu_read_unlock
出现在《Android系统启动流程之Linux内核》
RCU(Read-Copy Update)是数据同步的一种方式,在当前的Linux内核中发挥着重要的作用。RCU主要针对的数据对象是链表,目的是提高遍历读取数据的效率,为了达到目的使用RCU机制读取数据的时候不对链表进行耗时的加锁操作。这样在同一时间可以有多个线程同时读取该链表,并且允许一个线程对链表进行修改(修改的时候,需要加锁)
参考Linux 2.6内核中新的锁机制--RCU
三、内存与内存策略
3.1 numa_default_policy
设定NUMA系统的默认内存访问策略
3.2 mmap
将一个文件或者其它对象映射进内存
start:映射区的开始地址,设置为0时表示由系统决定映射区的起始地址。
length:映射区的长度。长度单位是 以字节为单位,不足一内存页按一内存页处理
prot:期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运算合理地组合在一起
flags:指定映射对象的类型,映射选项和映射页是否可以共享。它的值可以是一个或者多个以下位的组合体
fd:有效的文件描述词。一般是由open()函数返回,其值也可以设置为-1,此时需要指定flags参数中的MAP_ANON,表明进行的是匿名映射
off_toffset:被映射对象内容的起点。
四、通信
4.1 int socketpair(int d, int type, int protocol, int sv[2])
创建一对socket,用于本机内的进程通信
参数分别是:
SOCK_STREAM或SOCK_DGRAM,即TCP或UDP
SOCK_NONBLOCK read不到数据不阻塞,直接返回0
SOCK_CLOEXEC 设置文件描述符为O_CLOEXEC
4.2 int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
struct sigaction 类型用来描述对信号的处理,定义如下:
struct sigaction
{
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
sa_handler 是一个函数指针,其含义与 signal 函数中的信号处理函数类似
sa_sigaction 则是另一个信号处理函数,它有三个参数,可以获得关于信号的更详细的信息。当 sa_flags 成员的值包含了 SA_SIGINFO 标志时,系统将使用 sa_sigaction 函数作为信号处理函数,否则使用 sa_handler 作为信号处理函数。在某些系统中,成员 sa_handler 与 sa_sigaction 被放在联合体中,因此使用时不要同时设置。
sa_mask 成员用来指定在信号处理函数执行期间需要被屏蔽的信号,特别是当某个信号被处理时,它自身会被自动放入进程的信号掩码,因此在信号处理函数执行期间这个信号不会再度发生。
sa_flags 成员用于指定信号处理的行为,它可以是一下值的“按位或”组合。
The text was updated successfully, but these errors were encountered: