QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1986|回复: 10

看到很多兄弟喜欢谈操作系统,我给大家出个难题,嘿嘿:-)

[复制链接]
发表于 2003-1-13 15:44:06 | 显示全部楼层 |阅读模式
以前给学生培训LPI的时候经常拿这个问题“打击”他们,
大家来看看这个有关操作系统的基础题目:

i-node,data block,indirect data block,double indirect data block,triple indirect data block这些概念都是怎么回事儿?

一个inode对应一个文件,这个文件最大可以作到16G(还要加?k)
这个16G是怎么实现的,
inode的数据结构是怎样的?

大家有时间算一算,这是一个操作系统入门的题目。
发表于 2003-1-13 15:59:40 | 显示全部楼层
[code:1]
struct inode
{
  char i_flag;
  char i_count;
  int e_dev;
  int i_number;

  int i_mode;
  char i_nlink;
  char i_id;
  char i_gid;
  char i_size();
  char *i_size1;
  int i_addr[8];
  int i_lastr;
}
inode[NINODE];
[/code:1]

这是老的UNIX系统中的源代码
回复

使用道具 举报

 楼主| 发表于 2003-1-13 16:09:37 | 显示全部楼层
不错,计算机专业的必修课,可惜我不是学计算机的,
那16G又是怎么算出来的?
那些术语又是什么意思。
他们的关系是怎样的?
回复

使用道具 举报

发表于 2003-1-13 16:13:05 | 显示全部楼层
老实说:不知道,以前在华工蹭课时老师给我们算过,忘记得差不多了。

我边上有一本Unix的源码分析,正在复习中。
刚刚找了一下Linux的源码,居然没有找到inode的数据结构,继续找ing
回复

使用道具 举报

发表于 2003-1-13 16:39:18 | 显示全部楼层

Re: 看到很多兄弟喜欢谈操作系统,我给大家出个难题,嘿嘿:-)

[quote:bc432742ee="cjacker"]
i-node,data block,indirect data block,double indirect data block,triple indirect data block这些概念都是怎么回事儿?
[/quote]
这个就不多解释了,翻译一下好了,i节点,直接块,一级间接块,二级间接块,三级间接块
这些就是linux文件系统高明的地方,使系统可以用固定大小且空间不大的索引存储大文件.

[quote:bc432742ee="cjacker"]
inode的数据结构是怎样的?
[/quote]
ext2 的i节点数据结构
{
__u32 i_data[15];
__u32 i_flags;
__u32 i_faddr;
__u8   i_frag_no;
__u8   i_frag_size
__u16 i_osync;
__u32 i_file_acl;
__u32 i_dir_acl;
__u32 i_dtime;
__u32 i_version;
__u32 i_block_group;
__u32 i_next_alloc_block;
__u32 i_next_alloc_goal;
__u32 i_prealloc_block;
__u32 i_prealloc_count;
__u32 i_high_size;
int i_new_inode:1;
}

[quote:bc432742ee="cjacker"]
一个inode对应一个文件,这个文件最大可以作到16G(还要加?k)
这个16G是怎么实现的,
[/quote]
在i节点结构中的i_data[15]这个成员就是用来记录数据块地址的,为32位的整数.包含15个指针,其中12个指向直接块,另外三个分别指向一级间接块,二级间接块和三级间接块.每个直接块指向的数据块,直接用来存储文件数据,每个块存1k数据,12个直接块就是12k的数据.一级间接块则指向一个存储直接块的地址,32为寻址的话,一个一级间接块就可记载256(1024/4)个直接块,这样一个间接块可存储256k的数据.同理,所谓的二级间接块存储的是一级间接块的地址,这样,一个二级间接块就可以存储64M(256*256k)的数据.一样,三级间接块存储的是二级间接块的地址,这样,一个三级间接块就可存储16G(256*64M)的数据,由于pc是32位寻址,最大值是4G,因此linux下一个文件最大也就只能是4G而达不到16G.
回复

使用道具 举报

发表于 2003-1-13 16:48:30 | 显示全部楼层
[quote:de1f9d85e1="吴文官"]。
刚刚找了一下Linux的源码,居然没有找到inode的数据结构,继续找ing[/quote]

应该在include/linux/fs.h里吧,呵呵
回复

使用道具 举报

发表于 2003-1-13 17:01:04 | 显示全部楼层
2.4.18-14
[code:1]struct inode {
        struct list_head        i_hash;
        struct list_head        i_list;
        struct list_head        i_dentry;
       
        struct list_head        i_dirty_buffers;
        struct list_head        i_dirty_data_buffers;

        unsigned long                i_ino;
        atomic_t                i_count;
        kdev_t                        i_dev;
        umode_t                        i_mode;
        nlink_t                        i_nlink;
        user_id_t                        i_uid;
        gid_t                        i_gid;
        kdev_t                        i_rdev;
        loff_t                        i_size;
        time_t                        i_atime;
        time_t                        i_mtime;
        time_t                        i_ctime;
        unsigned int                i_blkbits;
        unsigned long                i_blksize;
        unsigned long                i_blocks;
        unsigned long                i_version;
        unsigned short                i_bytes;
        struct semaphore        i_sem;
        struct semaphore        i_zombie;
        struct inode_operations        *i_op;
        struct file_operations        *i_fop;        /* former ->i_op->default_file_ops */
        struct super_block        *i_sb;
        wait_queue_head_t        i_wait;
        struct file_lock        *i_flock;
        struct address_space        *i_mapping;
        struct address_space        i_data;
        struct dquot                *i_dquot[MAXQUOTAS];
        /* These three should probably be a union */
        struct list_head        i_devices;
        struct pipe_inode_info        *i_pipe;
        struct block_device        *i_bdev;
        struct char_device        *i_cdev;

        unsigned long                i_dnotify_mask; /* Directory notify events */
        struct dnotify_struct        *i_dnotify; /* for directory notifications */

        unsigned long                i_state;

        unsigned int                i_flags;
        unsigned char                i_sock;

        atomic_t                i_writecount;
        unsigned int                i_attr_flags;
        __u32                        i_generation;
        union {
                struct minix_inode_info                minix_i;
                struct ext2_inode_info                ext2_i;
                struct ext3_inode_info                ext3_i;
                struct hpfs_inode_info                hpfs_i;
                struct ntfs_inode_info                ntfs_i;
                struct msdos_inode_info                msdos_i;
                struct umsdos_inode_info        umsdos_i;
                struct iso_inode_info                isofs_i;
                struct sysv_inode_info                sysv_i;
                struct affs_inode_info                affs_i;
                struct ufs_inode_info                ufs_i;
                struct efs_inode_info                efs_i;
                struct romfs_inode_info                romfs_i;
                struct shmem_inode_info                shmem_i;
                struct coda_inode_info                coda_i;
                struct smb_inode_info                smbfs_i;
                struct hfs_inode_info                hfs_i;
                struct adfs_inode_info                adfs_i;
                struct qnx4_inode_info                qnx4_i;
                struct reiserfs_inode_info        reiserfs_i;
                struct bfs_inode_info                bfs_i;
                struct udf_inode_info                udf_i;
                struct ncp_inode_info                ncpfs_i;
                struct proc_inode_info                proc_i;
                struct socket                        socket_i;
                struct usbdev_inode_info        usbdev_i;
                struct hostfs_inode_info        hostfs_i;
                struct hppfs_inode_info                hppfs_i;
                struct jffs2_inode_info                jffs2_i;
                void                                *generic_ip;
        } u;
};[/code:1]
回复

使用道具 举报

发表于 2003-1-13 18:21:13 | 显示全部楼层
对 coollove 刮目相看!!!      

牛!
-------------------
这些东西我以前也找过,没找到
回复

使用道具 举报

发表于 2003-1-13 19:24:23 | 显示全部楼层
专业基础课必考的内容。
请画出第6,13,345,387,1353块在索引表中的位置(块大小为1K)

哈哈,烦透了。
回复

使用道具 举报

发表于 2003-1-13 23:31:05 | 显示全部楼层
后天要考操作系统就考这些的说,要重修啦!555
回复

使用道具 举报

发表于 2003-1-15 03:29:03 | 显示全部楼层
哈哈!coolove不愧为程序员出身的!看来公社里真是卧虎藏龙!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-22 17:38 , Processed in 0.076582 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表