linux相关基础

---
动态链接是指在生成可执行文件时不将所有程序用到的函数链接到一个文件,因为有许多函数在操作系统带的dll文件中,当程序运行时直接从操作系统中找。  

 而静态链接就是把所有用到的函数全部链接到exe文件中。

 动态链接是只建立一个引用的接口,而真正的代码和数据存放在另外的可执行模块中,在运行时再装入;  

 而静态链接是把所有的代码和数据都复制到本模块中,运行时就不再需要库了。

---

4G,Linux实现的是虚拟地址的前3G供给用户态的进程.1G是内核的部分.也就是用户态的进程不能访问0xc0000000以上的虚拟地址

---

多线程和多进程的区别,重点面试官最最关心的一个问题,必须从cpu调度,上下文切换,数据共享,多核cup利用率,资源占用,等等各方面回答,然后有一个问题必须会被问到:哪些东西是一个线程私有的?答案中必须包含寄存器,否则悲催

---

#include<stdio.h>

int main()

{    int a = 0x80000000;

    printf("os is%d\t%d\n",a,sizeof(int));

    union ut

    {       short s;

        char c[2];

    } u;

    if(sizeof(short) == 2)

    {       u.s =0x0102;

        if(u.c[0] == 1 &&u.c[1] == 2)

       {           printf("big enidan\n");

        }

        else if(u.c[0] == 2 &&u.c[1]== 1)

       {           printf("littleendian.\n");

        }

        return 0;

    }

    return 0;

}

---

汇编指令中:

   32位系统中,且i没有跨页,那么i++是原子的。其指令格式如下:

      movl x, %eax

      addl $1, %eax

      movl %eax, x

   64位系统中,i++无论如何也不是原子操作。其指令代码如下:

      movl x, %eax

      movl x+4, %edx

      addl $1, %eax

      adcl $0, %edx

      movl %eax, x

      movl %edx, x+4

   但是,在高级程序语言中,如javaC++等,并不能保证多个线程i++,操作同一个i,可以得到正确的结果。因为还有寄存器的因素,多个cpu对应多个寄存器。每次要先把i从内存复制到寄存器,然后++,然后再把i复制到内存中,这需要至少3步。从这个意义上讲,说i++是原子的并不对。

   之前我以为只要加上volatile修饰符就可以使i++操作编程原子性,但事实不是这样的。

   加上volatile只是在编译器优化时,提示每次都从内存中读取i的值。可是当两个线程进行操作时,仍然会出现重复写会的操作。(这句是我的猜测,因为我写的多线程程序会出现两次i++后结果一样的情况)

   因此,最安全的方法是将i++放入加锁的方法块中。这样就可以保证安全的访问量。例(对于java):synchronized method(){i++}

---

系统调用通过软中断int 0x80从用户态进入内核态。

函数库中的某些函数调用了系统调用。

函数库中的函数可以没有调用系统调用,也可以调用多个系统调用。

编程人员可以通过函数库调用系统调用。

高级编程也可以直接采用int 0x80进入系统调用,而不必通过函数库作为中介。

如果是在核心编程,也可以通过int 0x80进入系统调用,此时不能使用函数库。因为函数库中的函数是内核访问不到的。

你可能感兴趣的:(操作系统)